package com.ssm.netty.splitpacket;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class MyMessageDecoder extends ByteToMessageDecoder {

    int len = 0;

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        System.out.println("MyMessageDecoder decode 方法被调用了...");

        // 需要将得到的二进制字节码 -> MyMessageProtocol 数据包对象
        System.out.println(byteBuf);

        // 判断可读数据是否大于等于4
        if (byteBuf.readableBytes() >= 4) {
            if (len == 0) {
                // 读取并设置本次内容长度（此时消息格式是: len+content）
                len = byteBuf.readInt();
            }

            // 这里需要判断内容是否也发送过来了, 因为可能发生拆包导致只发送了数据长度
            if (byteBuf.readableBytes() < len) {
                System.out.println("当前可读数据不够, 继续等待...");
                return;
            }

            byte[] content = new byte[len];
            if (byteBuf.readableBytes() >= len) {
                byteBuf.readBytes(content);

                // 封装成MyMessageProtocol对象, 传递到下一个handler业务处理
                MyMessageProtocol protocol = new MyMessageProtocol();
                protocol.setLen(len);
                protocol.setContent(content);
                list.add(protocol);
            }

            len = 0;
        }
    }
}
